package com.example.java_chatroom.componet;

import com.example.java_chatroom.model.User;
import org.springframework.stereotype.Component;
import org.springframework.web.socket.WebSocketSession;

import java.util.concurrent.ConcurrentHashMap;

@Component
public class OnlineUserManager {
    // 如果登录成功则把这个用户的session插入hash表中表示上线了，下线则把这个用户的session从表中删除
    private ConcurrentHashMap<Integer, WebSocketSession> sessions = new ConcurrentHashMap<>();

    // 用户上线
    public void online(User user, WebSocketSession session) {
        // 避免客户端多开的情况
        if (getSession(user.getUserId()) != null) {
            System.out.println("用户 ["+ user.getUsername() + "] 已经被登录！登录失败！");
            return;
        }
        // 将这个用户的id对应的客户端的session存入hash表中
        sessions.put(user.getUserId(), session);
        System.out.println("用户 ["+ user.getUsername() + "] 上线！");
    }

    // 用户下线
    public void offline(User user, WebSocketSession session) {
        // 拿到这个在hash表中已经存在session
        WebSocketSession existsSession = getSession(user.getUserId());
        // 表中存在的existsSession与当前客户端的session进行比较，看看是否是同一个
        // 避免其它要下线的客户端以及未登录成功的客户端删除在线客户端的用户session
        if (existsSession == session) {
            //将这个session移除，表示用户下线
            sessions.remove(user.getUserId());
            System.out.println("用户 ["+ user.getUsername() + "] 下线！");
        }
    }

    // 获取这个用户的session
    public WebSocketSession getSession(int userId) {
        return sessions.get(userId);
    }
}
